﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;
using System.Text;
using System.Windows.Forms;
using Evolution.Common;
using mpcDotNET.Data;
using mpcDotNET.WindowsControls; 
using ComponentFactory.Krypton.Toolkit;

namespace TECassist
{
    public partial class Finanças : KryptonForm
    {
        public static String Ação;
        Pen myPen;
        Font myFont1, myFont2;
        StringFormat myFormat;
        Point pt1, pt2;
        int nmItem, qtItem, nmLin = 0, maxLin = 65;
        double totBoleto;
        mpcDotNET.WindowsControls.BoletoForm boleto;
        Database myDBase;

        public Finanças(Database myDBase)
        {
            InitializeComponent();
            this.myDBase = myDBase;
        }

        private void Form_Load(object sender, EventArgs e)
        {
            Pulso.Enabled = true;
            Starter.Enabled = true;
        }

        private void Starter_Tick(object sender, EventArgs e)
        {
            Starter.Enabled = false;
            if (Ação == "Vencidos") rot_LoadVencidos();
            else if (Ação == "Crédito") rot_LoadCréditos();
            else if (Ação == "Boletos") rot_LoadBoletos();
        }

        private void rot_LoadCréditos()
        {
            double[] totGeral = new double[4];
            Créditos tabCréd = new Créditos(myDBase);
            int dbRet = tabCréd.ListaTotais();
            if (dbRet != 0)
            {
                MessageBox.Show("Favor avisar a RamaSoft\n"
                    + "referência: " + this.Name + "LoadCréd\n" + tabCréd.MsgErro,
                    "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            for (int ix = 0; ix < tabCréd.Items.Count; ix++)
            {
                Cliente esteCliente = new Cliente(myDBase);
                esteCliente.Código = tabCréd.Items[ix].Cliente;
                dbRet = esteCliente.Obter();
                if (dbRet != 0)
                {
                    MessageBox.Show("Favor avisar a RamaSoft\n"
                        + "referência: " + this.Name + "LoadCrédCli\n" + esteCliente.MsgErro,
                        "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                string[] valores = new string[4];
                if (tabCréd.Items[ix].totCheque > 0)
                {
                    valores[0] = tabCréd.Items[ix].totCheque.ToString("##,##0.00");
                    totGeral[0] = totGeral[0] + tabCréd.Items[ix].totCheque;
                }
                else valores[0] = "";
                if (tabCréd.Items[ix].totCartão > 0)
                {
                    valores[1] = tabCréd.Items[ix].totCartão.ToString("##,##0.00");
                    totGeral[1] = totGeral[1] + tabCréd.Items[ix].totCartão;
                }
                else valores[1] = "";
                if (tabCréd.Items[ix].totNota > 0)
                {
                    valores[2] = tabCréd.Items[ix].totNota.ToString("##,##0.00");
                    totGeral[2] = totGeral[2] + tabCréd.Items[ix].totNota;
                }
                else valores[2] = "";
                if (tabCréd.Items[ix].totBoleto > 0)
                {
                    valores[3] = tabCréd.Items[ix].totBoleto.ToString("##,##0.00");
                    totGeral[3] = totGeral[3] + tabCréd.Items[ix].totBoleto;
                }
                else valores[3] = "";
                listaClientes.Rows.Add(esteCliente.Código.ToString(), esteCliente.Nome,
                    valores[0], valores[1], valores[2], valores[3]);                      
            }
            listaClientes.Sort(cliColuna1, ListSortDirection.Ascending);
            if (tabCréd.Items.Count > 0) listaClientes.Rows[0].Selected = false; 
            listaCrédTotal.Rows.Add(0,"   ... totais ...",totGeral[0].ToString("##,##0.00"),
               totGeral[1].ToString("##,##0.00"), totGeral[2].ToString("##,##0.00"), totGeral[3].ToString("##,##0.00"));
            if (tabCréd.Items.Count > 0) listaCrédTotal.Rows[0].Selected = false;
            boxFinanças.Visible = true;
            cmdPrint.Visible = true; 
            Pulso.Enabled = false;
            boxTiles.Visible = false; 
        }

        private void rot_LoadVencidos()
        {
            boxFinanças.Text = "Vencidos"; 
            cliColuna2.HeaderText = "Tipo";
            cliColuna3.HeaderText = "Número";
            cliColuna4.HeaderText = "Vencimento";
            cliColuna5.HeaderText = "Valor";
            cliColuna2.Width = 70;
            cliColuna4.Width = 110; 
            cliColuna2.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
            cliColuna3.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
            cliColuna4.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
            double totGeral = 0;
            Créditos tabCréd = new Créditos(myDBase);
            int dbRet = tabCréd.ListaVencido();
            if (dbRet != 0)
            {
                MessageBox.Show("Favor avisar a RamaSoft\n"
                    + "referência: " + this.Name + "LoadVenço\n" + tabCréd.MsgErro,
                    "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            for (int ix = 0; ix < tabCréd.Items.Count; ix++)
            {
                Cliente esteCliente = new Cliente(myDBase);
                esteCliente.Código = tabCréd.Items[ix].Cliente;
                dbRet = esteCliente.Obter();
                if (dbRet != 0)
                {
                    MessageBox.Show("Favor avisar a RamaSoft\n"
                        + "referência: " + this.Name + "LoadVençoCli\n" + esteCliente.MsgErro,
                        "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                string queTipo = "***";
                int nmTipo = tabCréd.Items[ix].Tipo;      
                if (nmTipo == 1) queTipo = "Cheque";
                else if (nmTipo == 2) queTipo = "Cartão";
                else if (nmTipo == 3) queTipo = "Notinha";
                else if (nmTipo == 4) queTipo = "Boleto";
                double valDeve = tabCréd.Items[ix].Valor / 100;
                listaClientes.Rows.Add(tabCréd.Items[ix].Número.ToString(),esteCliente.Nome, queTipo,
                    tabCréd.Items[ix].Cheque.ToString(), tabCréd.Items[ix].Vencto.ToString("dd/MM/yyyy"),
                    valDeve.ToString("##,##0.00"));
                totGeral = totGeral + valDeve; 
            }
            listaClientes.Sort(cliColuna1, ListSortDirection.Ascending);   
            if (tabCréd.Items.Count > 0) listaClientes.Rows[0].Selected = false; 
            listaCrédTotal.Rows.Add(0,"   ... totais ...","","","" , totGeral.ToString("##,##0.00"));
            listaCrédTotal.Rows[0].Selected = false;
            boxFinanças.Visible = true;
            cmdPrint.Visible = true; 
            Pulso.Enabled = false;
            boxTiles.Visible = false; 
        }

        private void rot_LoadBoletos()
        {
            boxFinanças.Text = "Boletos";
            cliColuna2.HeaderText = "Vencimento";
            cliColuna3.HeaderText = "Valor";
            cliColuna4.HeaderText = "Emitir";
            cliColuna2.Width = 100;
            cliColuna4.Width = 150;
            listaClientes.Columns.RemoveAt(5);
            cliColuna2.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
            cliColuna4.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
            listaCrédTotal.Columns.RemoveAt(5);
            totColuna2.Width = 100;
            totColuna4.Width = 150;
            double totGeral = 0;
            Créditos tabCréd = new Créditos(myDBase);
            int dbRet = tabCréd.ListaBoleto();
            if (dbRet != 0)
            {
                MessageBox.Show("Favor avisar a RamaSoft\n"
                    + "referência: " + this.Name + "LoadBoletoLista\n" + tabCréd.MsgErro,
                    "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            for (int ix = 0; ix < tabCréd.Items.Count; ix++)
            {
                Cliente esteCliente = new Cliente(myDBase);
                esteCliente.Código = tabCréd.Items[ix].Cliente;
                dbRet = esteCliente.Obter();
                if (dbRet != 0)
                {
                    MessageBox.Show("Favor avisar a RamaSoft\n"
                        + "referência: " + this.Name + "LoadBoletoCli\n" + esteCliente.MsgErro,
                        "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                double valDeve = tabCréd.Items[ix].Valor / 100;
                listaClientes.Rows.Add(tabCréd.Items[ix].Número.ToString(), esteCliente.Nome, 
                    tabCréd.Items[ix].Vencto.ToString("dd/MM/yyyy"), valDeve.ToString("##,##0.00"),
                    "OK", esteCliente.Código);
                totGeral = totGeral + valDeve;
            }
            listaClientes.Sort(cliColuna1, ListSortDirection.Ascending);
            totBoleto = totGeral; 
            if (tabCréd.Items.Count > 0) listaClientes.Rows[0].Selected = false;
            listaCrédTotal.Rows.Add(0, "   ... totais ...", "", 
                totGeral.ToString("##,##0.00"),totBoleto.ToString("##,##0.00"));
            listaCrédTotal.Rows[0].Selected = false;
            boxFinanças.Visible = true;
            cmdPrint.Visible = true;
            cmdGerar.Visible = true; 
            Pulso.Enabled = false;
            boxTiles.Visible = false;
        }

        private void Pulso_Tick(object sender, EventArgs e)
        {
            Pulso.Interval = 500; 
            tiles.Value = tiles.Value + 10;
            if (tiles.Value > 300) tiles.Value = 0;
        }

        private void cmdVoltar_Click(object sender, EventArgs e)
        {
            this.Close();  
        }

        private void cmdPrint_Click(object sender, EventArgs e)
        {
            cmdPrint.Visible = false;
            infoPrint.Visible = true; 
            PrintDocument docto = new PrintDocument();
            docto.PrintPage += new PrintPageEventHandler(this.docto_PrintPage);
            nmItem = 0;
            qtItem = listaClientes.Rows.Count;
            docto.Print();
        }

        private void docto_PrintPage(object sender, PrintPageEventArgs ev)
        {
            myPen = new Pen(Brushes.Black);
            pt1 = new Point(30, 53);
            pt2 = new Point(780, 53);
            ev.Graphics.DrawLine(myPen, pt1, pt2);
            myFont1 = new Font("Arial", 14);
            string loja = "Loja Modelo";
            ev.Graphics.DrawString(loja, myFont1, Brushes.Black, 30, 30);
            ev.Graphics.DrawString(boxFinanças.Text, myFont1, Brushes.Black, 340, 30);
            ev.Graphics.DrawString(DateTime.Today.ToString("dd/MM/yyyy"), myFont1, Brushes.Black, 680, 30);
            myFont2 = new Font("Arial", 11);
            myFormat = new StringFormat();
            myFormat.Alignment = StringAlignment.Far;
            if (Ação == "Crédito")
            {
                ev.Graphics.DrawString(cliColuna1.HeaderText, myFont2, Brushes.Black, 30, 55);
                ev.Graphics.DrawString(cliColuna2.HeaderText, myFont2, Brushes.Black, 450, 55, myFormat);
                ev.Graphics.DrawString(cliColuna3.HeaderText, myFont2, Brushes.Black, 550, 55, myFormat);
                ev.Graphics.DrawString(cliColuna4.HeaderText, myFont2, Brushes.Black, 650, 55, myFormat);
                ev.Graphics.DrawString(cliColuna5.HeaderText, myFont2, Brushes.Black, 750, 55, myFormat);
            }
            else if (Ação == "Vencidos")
            {
                ev.Graphics.DrawString(cliColuna1.HeaderText, myFont2, Brushes.Black, 30, 55);
                ev.Graphics.DrawString(cliColuna2.HeaderText, myFont2, Brushes.Black, 350, 55);
                ev.Graphics.DrawString(cliColuna3.HeaderText, myFont2, Brushes.Black, 420, 55);
                ev.Graphics.DrawString(cliColuna4.HeaderText, myFont2, Brushes.Black, 550, 55);
                ev.Graphics.DrawString(cliColuna5.HeaderText, myFont2, Brushes.Black, 750, 55, myFormat);
            }
            else if (Ação == "Boletos")
            {
                ev.Graphics.DrawString(cliColuna1.HeaderText, myFont2, Brushes.Black, 30, 55);
                ev.Graphics.DrawString(cliColuna2.HeaderText, myFont2, Brushes.Black, 350, 55);
                ev.Graphics.DrawString(cliColuna3.HeaderText, myFont2, Brushes.Black, 550, 55, myFormat);
                ev.Graphics.DrawString(cliColuna4.HeaderText, myFont2, Brushes.Black, 650, 55);
            }
            nmLin = 0;
            while (nmLin < maxLin && nmItem < qtItem)
            {
                int yPos = (nmLin * 16) + 75;
                if (Ação == "Crédito")
                {
                    ev.Graphics.DrawString(listaClientes.Rows[nmItem].Cells[1].Value.ToString(), myFont2, Brushes.Black, 30, yPos);
                    ev.Graphics.DrawString(listaClientes.Rows[nmItem].Cells[2].Value.ToString(), myFont2, Brushes.Black, 450, yPos, myFormat);
                    ev.Graphics.DrawString(listaClientes.Rows[nmItem].Cells[3].Value.ToString(), myFont2, Brushes.Black, 550, yPos, myFormat);
                    ev.Graphics.DrawString(listaClientes.Rows[nmItem].Cells[4].Value.ToString(), myFont2, Brushes.Black, 650, yPos, myFormat);
                    ev.Graphics.DrawString(listaClientes.Rows[nmItem].Cells[5].Value.ToString(), myFont2, Brushes.Black, 750, yPos, myFormat);
                }
                else if (Ação == "Vencidos")
                {
                    ev.Graphics.DrawString(listaClientes.Rows[nmItem].Cells[1].Value.ToString(), myFont2, Brushes.Black, 30, yPos);
                    ev.Graphics.DrawString(listaClientes.Rows[nmItem].Cells[2].Value.ToString(), myFont2, Brushes.Black, 350, yPos);
                    ev.Graphics.DrawString(listaClientes.Rows[nmItem].Cells[3].Value.ToString(), myFont2, Brushes.Black, 420, yPos);
                    ev.Graphics.DrawString(listaClientes.Rows[nmItem].Cells[4].Value.ToString(), myFont2, Brushes.Black, 550, yPos);
                    ev.Graphics.DrawString(listaClientes.Rows[nmItem].Cells[5].Value.ToString(), myFont2, Brushes.Black, 750, yPos, myFormat);
                }
                else if (Ação == "Boletos")
                {
                    ev.Graphics.DrawString(listaClientes.Rows[nmItem].Cells[1].Value.ToString(), myFont2, Brushes.Black, 30, yPos);
                    ev.Graphics.DrawString(listaClientes.Rows[nmItem].Cells[2].Value.ToString(), myFont2, Brushes.Black, 350, yPos);
                    ev.Graphics.DrawString(listaClientes.Rows[nmItem].Cells[3].Value.ToString(), myFont2, Brushes.Black, 550, yPos, myFormat);
                    ev.Graphics.DrawString(listaClientes.Rows[nmItem].Cells[4].Value.ToString(), myFont2, Brushes.Black, 650, yPos);
                }
                nmItem++;
                nmLin++;
            }
            if (nmItem < qtItem) ev.HasMorePages = true;
            else
            {
                ev.HasMorePages = false;
                int yPos = (nmLin * 16) + 77;
                pt1 = new Point(30, yPos);
                pt2 = new Point(780, yPos);
                ev.Graphics.DrawLine(myPen, pt1, pt2);
                yPos = yPos + 2;
                if (Ação == "Crédito")
                {
                    ev.Graphics.DrawString(listaCrédTotal.Rows[0].Cells[1].Value.ToString(), myFont2, Brushes.Black, 30, yPos);
                    ev.Graphics.DrawString(listaCrédTotal.Rows[0].Cells[2].Value.ToString(), myFont2, Brushes.Black, 450, yPos, myFormat);
                    ev.Graphics.DrawString(listaCrédTotal.Rows[0].Cells[3].Value.ToString(), myFont2, Brushes.Black, 550, yPos, myFormat);
                    ev.Graphics.DrawString(listaCrédTotal.Rows[0].Cells[4].Value.ToString(), myFont2, Brushes.Black, 650, yPos, myFormat);
                    ev.Graphics.DrawString(listaCrédTotal.Rows[0].Cells[5].Value.ToString(), myFont2, Brushes.Black, 750, yPos, myFormat);
                }
                else if (Ação == "Vencidos")
                {
                    ev.Graphics.DrawString(listaCrédTotal.Rows[0].Cells[1].Value.ToString(), myFont2, Brushes.Black, 30, yPos);
                    ev.Graphics.DrawString(listaCrédTotal.Rows[0].Cells[5].Value.ToString(), myFont2, Brushes.Black, 750, yPos, myFormat);
                }
                else if (Ação == "Boletos")
                {
                    ev.Graphics.DrawString(listaCrédTotal.Rows[0].Cells[1].Value.ToString(), myFont2, Brushes.Black, 30, yPos);
                    ev.Graphics.DrawString(listaCrédTotal.Rows[0].Cells[3].Value.ToString(), myFont2, Brushes.Black, 550, yPos, myFormat);
                    ev.Graphics.DrawString(listaCrédTotal.Rows[0].Cells[4].Value.ToString(), myFont2, Brushes.Black, 650, yPos, myFormat);
                }
            }
        }

        private void listaClientes_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if ((((DataGridView)sender).CurrentCell.ColumnIndex == 4) &&
                (Ação == "Boletos"))
            {
                int qRow = ((DataGridView)sender).CurrentRow.Index;
                string status =listaClientes.Rows[qRow].Cells[4].Value.ToString();
                if (status == "OK")
                {
                    status = "NÃO GERAR";
                    totBoleto = totBoleto - Convert.ToDouble(listaClientes.Rows[qRow].Cells[3].Value.ToString());
                }
                else
                {
                    status = "OK";
                    totBoleto = totBoleto + Convert.ToDouble(listaClientes.Rows[qRow].Cells[3].Value.ToString());
                }
                listaClientes.Rows[qRow].Cells[4].Value = status;
                listaCrédTotal.Rows[0].Cells[4].Value = totBoleto.ToString("###,##0.00");
            }
        }

        private void cmdGerar_Click(object sender, EventArgs e)
        {
            cmdGerar.Visible = false;  
            cliColuna4.HeaderText = "Número Gerado";
            boleto = new mpcDotNET.WindowsControls.BoletoForm();
            BoletoInfo bolInfo = new BoletoInfo();
            SacadoInfo sacado = new SacadoInfo();
            CedenteInfo cedente = new CedenteInfo();
            Cliente esteCliente = new Cliente(myDBase);
            cadsGerais tabDados = new cadsGerais(myDBase);
            tabDados.Tipo = "K";
            int dbRet = tabDados.Lista();
            if (dbRet != 0)
            {
                MessageBox.Show("Favor avisar a RamaSoft\n"
                    + "referência: " + this.Name + "GeraDados\n" + tabDados.MsgErro,
                    "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            cedente.Banco = tabDados.Items[0].Descrição.Trim();
            cedente.Agencia = tabDados.Items[2].Descrição.Trim();
            cedente.Conta = tabDados.Items[3].Descrição.Trim();
            cedente.Carteira = tabDados.Items[4].Descrição.Trim();
            cedente.Cedente = tabDados.Items[1].Descrição.Trim();
            cedente.CodCedente = tabDados.Items[5].Descrição.Trim();
            cedente.Convenio = tabDados.Items[6].Descrição.Trim();
            cedente.Modalidade = tabDados.Items[7].Descrição.Trim();
            int nossoNumo = Convert.ToInt32 (tabDados.Items[8].Descrição.Trim());
            for (int qRow = 0; qRow < listaClientes.Rows.Count; qRow++)
            {
                if (listaClientes.Rows[qRow].Cells[4].Value.ToString() == "OK")
                {
                    esteCliente.Código = Convert.ToInt32(listaClientes.Rows[qRow].Cells[5].Value);
                    dbRet = esteCliente.Obter();
                    if (dbRet != 0)
                    {
                        MessageBox.Show("Favor avisar a RamaSoft\n"
                            + "referência: " + this.Name + "GeraCli\n" + esteCliente.MsgErro,
                            "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                    sacado.Sacado = esteCliente.Nome;
                    sacado.Documento = esteCliente.CPF;
                    sacado.Endereco = esteCliente.Endereço;
                    sacado.Bairro = esteCliente.Setor;
                    sacado.Cidade = esteCliente.Cidade;
                    sacado.Cep = esteCliente.CEP;
                    sacado.UF = esteCliente.Estado;
                    nossoNumo = nossoNumo + 1;
                    bolInfo.NossoNumero = nossoNumo.ToString(); 
                    bolInfo.NumeroDocumento = "9988776655";
                    bolInfo.Valor = 0;
                    bolInfo.Quantidade = 0;
                    bolInfo.ValorDocumento = Convert.ToDouble(listaClientes.Rows[qRow].Cells[3].Value.ToString());
                    bolInfo.DataDocumento = DateTime.Today;   
                    bolInfo.DataVencimento = Convert.ToDateTime (listaClientes.Rows[qRow].Cells[2].Value);
                    bolInfo.Demonstrativo = "...";
                    bolInfo.Instrucoes = "Após o vencimento, aplicar multa de 2% e mora de 1% ao mês";
                    bool comErro = false;
                    try
                    {
                        boleto.MakeBoleto(cedente, sacado, bolInfo);
                        boleto.Refresh();
                    }
                    catch
                    {
                        Exception er = new Exception();
                        MessageBox.Show(er.Message);
                        comErro = true;
                    }
                    if (comErro) return;
                    PrintDocument prtBol = new PrintDocument();
                    prtBol.PrintPage += new PrintPageEventHandler(prtBol_PrintPage);
                    prtBol.Print(); 
                    listaClientes.Rows[qRow].Cells[4].Value = nossoNumo.ToString();
                }
                else listaClientes.Rows[qRow].Cells[4].Value = "não gerado";
            }
            listaClientes.Enabled = false;
            listaCrédTotal.Enabled = false; 
        }

        void prtBol_PrintPage(object sender, PrintPageEventArgs e)
        {
            boleto.PrintType = PrintTypes.Documet;
            boleto.Print(e.Graphics);
        }
    }
}
